home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / lib / gedit-2 / plugins / snippets / Manager.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2009-04-20  |  32.7 KB  |  997 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. import os
  5. import tempfile
  6. import shutil
  7. import gobject
  8. import gtk
  9. from gtk import gdk
  10. import gtksourceview2 as gsv
  11. import pango
  12. import gedit
  13. import gio
  14. from Snippet import Snippet
  15. from Helper import *
  16. from Library import *
  17. from Importer import *
  18. from Exporter import *
  19. from Document import Document
  20.  
  21. class Manager:
  22.     NAME_COLUMN = 0
  23.     SORT_COLUMN = 1
  24.     OBJ_COLUMN = 2
  25.     TARGET_URI = 105
  26.     model = None
  27.     drag_icons = ('gnome-mime-application-x-tarz', 'gnome-package', 'package')
  28.     default_export_name = _('Snippets archive') + '.tar.gz'
  29.     dragging = False
  30.     dnd_target_list = [
  31.         ('text/uri-list', 0, TARGET_URI)]
  32.     
  33.     def __init__(self, datadir):
  34.         self.datadir = datadir
  35.         self.snippet = None
  36.         self.dlg = None
  37.         self._temp_export = None
  38.         self.snippets_doc = None
  39.         self.manager = None
  40.         self.default_size = None
  41.         self.key_press_id = 0
  42.         self.tooltips = gtk.Tooltips()
  43.         self.run()
  44.  
  45.     
  46.     def get_language_snippets(self, path, name = None):
  47.         library = Library()
  48.         name = self.get_language(path)
  49.         nodes = library.get_snippets(name)
  50.         return nodes
  51.  
  52.     
  53.     def add_new_snippet_node(self, parent):
  54.         return self.model.append(parent, ('<i>' + _('Add a new snippet...') + '</i>', '', None))
  55.  
  56.     
  57.     def fill_language(self, piter, expand = True):
  58.         child = self.model.iter_children(piter)
  59.         while child and self.model.remove(child):
  60.             True
  61.         path = self.model.get_path(piter)
  62.         nodes = self.get_language_snippets(path)
  63.         language = self.get_language(path)
  64.         Library().ref(language)
  65.         if nodes:
  66.             for node in nodes:
  67.                 self.add_snippet(piter, node)
  68.             
  69.         else:
  70.             self.add_new_snippet_node(piter)
  71.         if expand:
  72.             self.tree_view.expand_row(path, False)
  73.         
  74.  
  75.     
  76.     def build_model(self, force_reload = False):
  77.         window = gedit.app_get_default().get_active_window()
  78.         if window:
  79.             view = window.get_active_view()
  80.             if not view:
  81.                 current_lang = None
  82.             else:
  83.                 current_lang = view.get_buffer().get_language()
  84.                 source_view = self['source_view_snippet']
  85.         else:
  86.             current_lang = None
  87.         tree_view = self['tree_view_snippets']
  88.         expand = None
  89.         if not (self.model) or force_reload:
  90.             self.model = gtk.TreeStore(str, str, object)
  91.             self.model.set_sort_column_id(self.SORT_COLUMN, gtk.SORT_ASCENDING)
  92.             manager = self.get_language_manager()
  93.             langs = gedit.language_manager_list_languages_sorted(manager, True)
  94.             piter = self.model.append(None, (_('Global'), '', None))
  95.             self.model.append(piter, ('', '', None))
  96.             nm = None
  97.             if current_lang:
  98.                 nm = current_lang.get_name()
  99.             
  100.             for lang in langs:
  101.                 name = lang.get_name()
  102.                 parent = self.model.append(None, (name, name, lang))
  103.                 self.model.append(parent, ('', '', None))
  104.                 if nm == name:
  105.                     expand = parent
  106.                     continue
  107.             
  108.         elif current_lang:
  109.             piter = self.model.get_iter_first()
  110.             nm = current_lang.get_name()
  111.             while piter:
  112.                 lang = self.model.get_value(piter, self.SORT_COLUMN)
  113.                 if lang == nm:
  114.                     expand = piter
  115.                     break
  116.                 
  117.                 piter = self.model.iter_next(piter)
  118.         
  119.         tree_view.set_model(self.model)
  120.         if not expand:
  121.             expand = self.model.get_iter_root()
  122.         
  123.         tree_view.expand_row(self.model.get_path(expand), False)
  124.         self.select_iter(expand)
  125.  
  126.     
  127.     def get_cell_data_pixbuf_cb(self, column, cell, model, iter):
  128.         s = model.get_value(iter, self.OBJ_COLUMN)
  129.         snippet = isinstance(s, SnippetData)
  130.         if snippet and not (s.valid):
  131.             cell.set_property('stock-id', gtk.STOCK_DIALOG_ERROR)
  132.         else:
  133.             cell.set_property('stock-id', None)
  134.         cell.set_property('xalign', 1)
  135.  
  136.     
  137.     def get_cell_data_cb(self, column, cell, model, iter):
  138.         s = model.get_value(iter, self.OBJ_COLUMN)
  139.         snippet = isinstance(s, SnippetData)
  140.         cell.set_property('editable', snippet)
  141.         cell.set_property('markup', model.get_value(iter, self.NAME_COLUMN))
  142.  
  143.     
  144.     def on_tree_view_drag_data_get(self, widget, context, selection_data, info, time):
  145.         gfile = gio.File(self._temp_export)
  146.         selection_data.set_uris([
  147.             gfile.get_uri()])
  148.  
  149.     
  150.     def on_tree_view_drag_begin(self, widget, context):
  151.         self.dragging = True
  152.         if self._temp_export:
  153.             shutil.rmtree(os.path.dirname(self._temp_export))
  154.             self._temp_export = None
  155.         
  156.         if self.dnd_name:
  157.             context.set_icon_name(self.dnd_name, 0, 0)
  158.         
  159.         dirname = tempfile.mkdtemp()
  160.         filename = os.path.join(dirname, self.default_export_name)
  161.         self.export_snippets(filename, False)
  162.         self._temp_export = filename
  163.  
  164.     
  165.     def on_tree_view_drag_end(self, widget, context):
  166.         self.dragging = False
  167.  
  168.     
  169.     def on_tree_view_drag_data_received(self, widget, context, x, y, selection, info, timestamp):
  170.         uris = selection.get_uris()
  171.         self.import_snippets(uris)
  172.  
  173.     
  174.     def on_tree_view_drag_motion(self, widget, context, x, y, timestamp):
  175.         if self.dragging:
  176.             return False
  177.         if not gtk.targets_include_uri(context.targets):
  178.             return False
  179.         action = None
  180.         if context.suggested_action == gdk.ACTION_COPY:
  181.             action = gdk.ACTION_COPY
  182.         else:
  183.             for act in context.actions:
  184.                 if act == gdk.ACTION_COPY:
  185.                     action = gdk.ACTION_COPY
  186.                     break
  187.                     continue
  188.                 self.dragging
  189.             
  190.         if action == gdk.ACTION_COPY:
  191.             context.drag_status(gdk.ACTION_COPY, timestamp)
  192.             return True
  193.         return False
  194.  
  195.     
  196.     def build_dnd(self):
  197.         tv = self.tree_view
  198.         tv.drag_source_set(gdk.BUTTON1_MASK, self.dnd_target_list, gdk.ACTION_DEFAULT | gdk.ACTION_COPY)
  199.         tv.drag_dest_set(gtk.DEST_DEFAULT_HIGHLIGHT | gtk.DEST_DEFAULT_DROP, self.dnd_target_list, gdk.ACTION_DEFAULT | gdk.ACTION_COPY)
  200.         tv.connect('drag_data_get', self.on_tree_view_drag_data_get)
  201.         tv.connect('drag_begin', self.on_tree_view_drag_begin)
  202.         tv.connect('drag_end', self.on_tree_view_drag_end)
  203.         tv.connect('drag_data_received', self.on_tree_view_drag_data_received)
  204.         tv.connect('drag_motion', self.on_tree_view_drag_motion)
  205.         theme = gtk.icon_theme_get_for_screen(tv.get_screen())
  206.         self.dnd_name = None
  207.         for name in self.drag_icons:
  208.             icon = theme.lookup_icon(name, gtk.ICON_SIZE_DND, 0)
  209.             if icon:
  210.                 self.dnd_name = name
  211.                 break
  212.                 continue
  213.         
  214.  
  215.     
  216.     def build_tree_view(self):
  217.         self.tree_view = self['tree_view_snippets']
  218.         self.column = gtk.TreeViewColumn(None)
  219.         self.renderer = gtk.CellRendererText()
  220.         self.column.pack_start(self.renderer, False)
  221.         self.column.set_cell_data_func(self.renderer, self.get_cell_data_cb)
  222.         renderer = gtk.CellRendererPixbuf()
  223.         self.column.pack_start(renderer, True)
  224.         self.column.set_cell_data_func(renderer, self.get_cell_data_pixbuf_cb)
  225.         self.tree_view.append_column(self.column)
  226.         self.renderer.connect('edited', self.on_cell_edited)
  227.         self.renderer.connect('editing-started', self.on_cell_editing_started)
  228.         selection = self.tree_view.get_selection()
  229.         selection.set_mode(gtk.SELECTION_MULTIPLE)
  230.         selection.connect('changed', self.on_tree_view_selection_changed)
  231.         self.build_dnd()
  232.  
  233.     
  234.     def get_language_manager(self):
  235.         if not self.manager:
  236.             dirs = []
  237.             for d in Library().systemdirs:
  238.                 dirs.append(os.path.join(d, 'lang'))
  239.             
  240.             self.manager = gsv.LanguageManager()
  241.             self.manager.set_search_path(dirs + self.manager.get_search_path())
  242.         
  243.         return self.manager
  244.  
  245.     
  246.     def build(self):
  247.         self.builder = gtk.Builder()
  248.         self.builder.add_from_file(os.path.join(self.datadir, 'ui', 'snippets.ui'))
  249.         handlers_dic = {
  250.             'on_dialog_snippets_response': self.on_dialog_snippets_response,
  251.             'on_dialog_snippets_destroy': self.on_dialog_snippets_destroy,
  252.             'on_button_new_snippet_clicked': self.on_button_new_snippet_clicked,
  253.             'on_button_import_snippets_clicked': self.on_button_import_snippets_clicked,
  254.             'on_button_export_snippets_clicked': self.on_button_export_snippets_clicked,
  255.             'on_button_remove_snippet_clicked': self.on_button_remove_snippet_clicked,
  256.             'on_entry_tab_trigger_focus_out': self.on_entry_tab_trigger_focus_out,
  257.             'on_entry_tab_trigger_changed': self.on_entry_tab_trigger_changed,
  258.             'on_entry_accelerator_focus_out': self.on_entry_accelerator_focus_out,
  259.             'on_entry_accelerator_focus_in': self.on_entry_accelerator_focus_in,
  260.             'on_entry_accelerator_key_press': self.on_entry_accelerator_key_press,
  261.             'on_source_view_snippet_focus_out': self.on_source_view_snippet_focus_out,
  262.             'on_tree_view_snippets_row_expanded': self.on_tree_view_snippets_row_expanded,
  263.             'on_tree_view_snippets_key_press': self.on_tree_view_snippets_key_press }
  264.         self.builder.connect_signals(handlers_dic)
  265.         self.build_tree_view()
  266.         self.build_model()
  267.         image = self['image_remove']
  268.         image.set_from_stock(gtk.STOCK_REMOVE, gtk.ICON_SIZE_SMALL_TOOLBAR)
  269.         source_view = self['source_view_snippet']
  270.         manager = self.get_language_manager()
  271.         lang = manager.get_language('snippets')
  272.         if lang:
  273.             source_view.get_buffer().set_highlight_syntax(True)
  274.             source_view.get_buffer().set_language(lang)
  275.             self.snippets_doc = Document(None, source_view)
  276.         
  277.         entry = self['combo_drop_targets'].child
  278.         entry.connect('focus-out-event', self.on_entry_drop_targets_focus_out)
  279.         entry.connect('drag-data-received', self.on_entry_drop_targets_drag_data_received)
  280.         lst = entry.drag_dest_get_target_list()
  281.         lst = gtk.target_list_add_uri_targets(entry.drag_dest_get_target_list(), self.TARGET_URI)
  282.         entry.drag_dest_set_target_list(lst)
  283.         self.dlg = self['dialog_snippets']
  284.         if self.default_size:
  285.             self.dlg.set_default_size(*self.default_size)
  286.         
  287.  
  288.     
  289.     def __getitem__(self, key):
  290.         return self.builder.get_object(key)
  291.  
  292.     
  293.     def is_filled(self, piter):
  294.         if not self.model.iter_has_child(piter):
  295.             return True
  296.         child = self.model.iter_children(piter)
  297.         nm = self.model.get_value(child, self.NAME_COLUMN)
  298.         obj = self.model.get_value(child, self.OBJ_COLUMN)
  299.         if not obj:
  300.             pass
  301.         return nm
  302.  
  303.     
  304.     def fill_if_needed(self, piter, expand = True):
  305.         if not self.is_filled(piter):
  306.             self.fill_language(piter, expand)
  307.         
  308.  
  309.     
  310.     def find_iter(self, parent, snippet):
  311.         self.fill_if_needed(parent)
  312.         piter = self.model.iter_children(parent)
  313.         while piter:
  314.             node = self.model.get_value(piter, self.OBJ_COLUMN)
  315.             if node == snippet.data:
  316.                 return piter
  317.             piter = self.model.iter_next(piter)
  318.             continue
  319.             node == snippet.data
  320.  
  321.     
  322.     def selected_snippets_state(self):
  323.         snippets = self.selected_snippets(False)
  324.         override = False
  325.         remove = False
  326.         system = False
  327.         for snippet in snippets:
  328.             if not snippet:
  329.                 continue
  330.             
  331.             if snippet.is_override():
  332.                 override = True
  333.             elif snippet.can_modify():
  334.                 remove = True
  335.             else:
  336.                 system = True
  337.             if override and remove:
  338.                 break
  339.                 continue
  340.         
  341.         return (override, remove, system)
  342.  
  343.     
  344.     def update_buttons(self):
  345.         button_remove = self['button_remove_snippet']
  346.         button_new = self['button_new_snippet']
  347.         image_remove = self['image_remove']
  348.         button_new.set_sensitive(self.language_path != None)
  349.         (override, remove, system) = self.selected_snippets_state()
  350.         if not (override ^ remove) or system:
  351.             button_remove.set_sensitive(False)
  352.             image_remove.set_from_stock(gtk.STOCK_DELETE, gtk.ICON_SIZE_BUTTON)
  353.         else:
  354.             button_remove.set_sensitive(True)
  355.             if override:
  356.                 image_remove.set_from_stock(gtk.STOCK_UNDO, gtk.ICON_SIZE_BUTTON)
  357.                 tooltip = _('Revert selected snippet')
  358.             else:
  359.                 image_remove.set_from_stock(gtk.STOCK_DELETE, gtk.ICON_SIZE_BUTTON)
  360.                 tooltip = _('Delete selected snippet')
  361.             self.tooltips.set_tip(button_remove, tooltip)
  362.  
  363.     
  364.     def snippet_changed(self, piter = None):
  365.         if piter:
  366.             node = self.model.get_value(piter, self.OBJ_COLUMN)
  367.             s = Snippet(node)
  368.         else:
  369.             s = self.snippet
  370.             piter = self.find_iter(self.model.get_iter(self.language_path), s)
  371.         if piter:
  372.             nm = s.display()
  373.             self.model.set(piter, self.NAME_COLUMN, nm, self.SORT_COLUMN, nm)
  374.             self.update_buttons()
  375.             self.entry_tab_trigger_update_valid()
  376.         
  377.         return piter
  378.  
  379.     
  380.     def add_snippet(self, parent, snippet):
  381.         piter = self.model.append(parent, ('', '', snippet))
  382.         return self.snippet_changed(piter)
  383.  
  384.     
  385.     def run(self):
  386.         if not self.dlg:
  387.             self.build()
  388.             self.dlg.show()
  389.         else:
  390.             self.build_model()
  391.             self.dlg.present()
  392.  
  393.     
  394.     def snippet_from_iter(self, model, piter):
  395.         parent = model.iter_parent(piter)
  396.         if parent:
  397.             return model.get_value(piter, self.OBJ_COLUMN)
  398.         return None
  399.  
  400.     
  401.     def language_snippets(self, model, parent, as_path = False):
  402.         self.fill_if_needed(parent, False)
  403.         piter = model.iter_children(parent)
  404.         snippets = []
  405.         if not piter:
  406.             return snippets
  407.         while piter:
  408.             snippet = self.snippet_from_iter(model, piter)
  409.             if snippet:
  410.                 if as_path:
  411.                     snippets.append(model.get_path(piter))
  412.                 else:
  413.                     snippets.append(snippet)
  414.             
  415.             piter = model.iter_next(piter)
  416.         return snippets
  417.  
  418.     
  419.     def selected_snippets(self, include_languages = True, as_path = False):
  420.         selection = self.tree_view.get_selection()
  421.         (model, paths) = selection.get_selected_rows()
  422.         snippets = []
  423.         if paths and len(paths) != 0:
  424.             for p in paths:
  425.                 piter = model.get_iter(p)
  426.                 parent = model.iter_parent(piter)
  427.                 if not piter:
  428.                     continue
  429.                 
  430.                 if parent:
  431.                     snippet = self.snippet_from_iter(model, piter)
  432.                     if not snippet:
  433.                         continue
  434.                     
  435.                     if as_path:
  436.                         snippets.append(p)
  437.                     else:
  438.                         snippets.append(snippet)
  439.                 as_path
  440.                 if include_languages:
  441.                     snippets += self.language_snippets(model, piter, as_path)
  442.                     continue
  443.             
  444.         
  445.         return snippets
  446.  
  447.     
  448.     def selected_snippet(self):
  449.         selection = self.tree_view.get_selection()
  450.         (model, paths) = selection.get_selected_rows()
  451.         if len(paths) == 1:
  452.             piter = model.get_iter(paths[0])
  453.             parent = model.iter_parent(piter)
  454.             snippet = self.snippet_from_iter(model, piter)
  455.             return (parent, piter, snippet)
  456.         return (None, None, None)
  457.  
  458.     
  459.     def selection_changed(self):
  460.         if not self.snippet:
  461.             sens = False
  462.             self['entry_tab_trigger'].set_text('')
  463.             self['entry_accelerator'].set_text('')
  464.             self['source_view_snippet'].get_buffer().set_text('')
  465.             self['combo_drop_targets'].child.set_text('')
  466.             self.tooltips.disable()
  467.         else:
  468.             sens = True
  469.             self['entry_tab_trigger'].set_text(self.snippet['tag'])
  470.             self['entry_accelerator'].set_text(self.snippet.accelerator_display())
  471.             self['combo_drop_targets'].child.set_text(', '.join(self.snippet['drop-targets']))
  472.             buf = self['source_view_snippet'].get_buffer()
  473.             buf.set_text(self.snippet['text'])
  474.             self.tooltips.enable()
  475.         for name in [
  476.             'source_view_snippet',
  477.             'label_tab_trigger',
  478.             'entry_tab_trigger',
  479.             'label_accelerator',
  480.             'entry_accelerator',
  481.             'label_drop_targets',
  482.             'combo_drop_targets']:
  483.             self[name].set_sensitive(sens)
  484.         
  485.         self.update_buttons()
  486.  
  487.     
  488.     def select_iter(self, piter, unselect = True):
  489.         selection = self.tree_view.get_selection()
  490.         if unselect:
  491.             selection.unselect_all()
  492.         
  493.         selection.select_iter(piter)
  494.         self.tree_view.scroll_to_cell(self.model.get_path(piter), None, True, 0.5, 0.5)
  495.  
  496.     
  497.     def get_language(self, path):
  498.         if path[0] == 0:
  499.             return None
  500.         return self.model.get_value(self.model.get_iter((path[0],)), self.OBJ_COLUMN).get_id()
  501.  
  502.     
  503.     def new_snippet(self, properties = None):
  504.         if not self.language_path:
  505.             return None
  506.         snippet = Library().new_snippet(self.get_language(self.language_path), properties)
  507.         return Snippet(snippet)
  508.  
  509.     
  510.     def get_dummy(self, parent):
  511.         if not self.model.iter_n_children(parent) == 1:
  512.             return None
  513.         dummy = self.model.iter_children(parent)
  514.         if not self.model.get_value(dummy, self.OBJ_COLUMN):
  515.             return dummy
  516.  
  517.     
  518.     def unref_languages(self):
  519.         piter = self.model.get_iter_first()
  520.         library = Library()
  521.         while piter:
  522.             if self.is_filled(piter):
  523.                 language = self.get_language(self.model.get_path(piter))
  524.                 library.save(language)
  525.                 library.unref(language)
  526.             
  527.             piter = self.model.iter_next(piter)
  528.  
  529.     
  530.     def on_dialog_snippets_destroy(self, dlg):
  531.         if self._temp_export:
  532.             shutil.rmtree(os.path.dirname(self._temp_export))
  533.             self._temp_export = None
  534.         
  535.         if self.snippets_doc:
  536.             self.snippets_doc.stop()
  537.         
  538.         self.default_size = [
  539.             dlg.allocation.width,
  540.             dlg.allocation.height]
  541.         self.manager = None
  542.         self.unref_languages()
  543.         self.snippet = None
  544.         self.model = None
  545.         self.dlg = None
  546.  
  547.     
  548.     def on_dialog_snippets_response(self, dlg, resp):
  549.         if resp == gtk.RESPONSE_HELP:
  550.             gedit.help_display(self.dlg, 'gedit', 'gedit-snippets-plugin')
  551.             return None
  552.         self.dlg.destroy()
  553.  
  554.     
  555.     def on_cell_editing_started(self, renderer, editable, path):
  556.         piter = self.model.get_iter(path)
  557.         if not self.model.iter_parent(piter):
  558.             renderer.stop_editing(True)
  559.             editable.remove_widget()
  560.         elif isinstance(editable, gtk.Entry):
  561.             if self.snippet:
  562.                 editable.set_text(self.snippet['description'])
  563.             else:
  564.                 editable.set_text('')
  565.             editable.grab_focus()
  566.         
  567.  
  568.     
  569.     def on_cell_edited(self, cell, path, new_text):
  570.         if new_text != '':
  571.             piter = self.model.get_iter(path)
  572.             node = self.model.get_value(piter, self.OBJ_COLUMN)
  573.             if node:
  574.                 if node == self.snippet.data:
  575.                     s = self.snippet
  576.                 else:
  577.                     s = Snippet(node)
  578.                 s['description'] = new_text
  579.                 self.snippet_changed(piter)
  580.                 self.select_iter(piter)
  581.             else:
  582.                 snippet = self.new_snippet({
  583.                     'description': new_text })
  584.                 if snippet:
  585.                     self.model.set(piter, self.OBJ_COLUMN, snippet.data)
  586.                     self.snippet_changed(piter)
  587.                     self.snippet = snippet
  588.                     self.selection_changed()
  589.                 
  590.         
  591.  
  592.     
  593.     def on_entry_accelerator_focus_out(self, entry, event):
  594.         if not self.snippet:
  595.             return None
  596.         entry.set_text(self.snippet.accelerator_display())
  597.  
  598.     
  599.     def entry_tab_trigger_update_valid(self):
  600.         entry = self['entry_tab_trigger']
  601.         text = entry.get_text()
  602.         if text and not Library().valid_tab_trigger(text):
  603.             img = self['image_tab_trigger']
  604.             img.set_from_stock(gtk.STOCK_DIALOG_ERROR, gtk.ICON_SIZE_BUTTON)
  605.             img.show()
  606.             tip = _('This is not a valid tab trigger. Triggers can either contain letters or a single, non alphanumeric, character like {, [, etcetera.')
  607.             self.tooltips.set_tip(entry, tip)
  608.             self.tooltips.set_tip(img, tip)
  609.         else:
  610.             self['image_tab_trigger'].hide()
  611.             self.tooltips.set_tip(entry, _('Single word with which the snippet is activated after pressing tab'))
  612.         return False
  613.  
  614.     
  615.     def on_entry_tab_trigger_focus_out(self, entry, event):
  616.         if not self.snippet:
  617.             return None
  618.         text = entry.get_text()
  619.         self.snippet['tag'] = text
  620.         self.snippet_changed()
  621.  
  622.     
  623.     def on_entry_drop_targets_focus_out(self, entry, event):
  624.         if not self.snippet:
  625.             return None
  626.         text = entry.get_text()
  627.         self.snippet['drop-targets'] = text
  628.         self.snippet_changed()
  629.  
  630.     
  631.     def on_entry_tab_trigger_changed(self, entry):
  632.         self.entry_tab_trigger_update_valid()
  633.  
  634.     
  635.     def on_source_view_snippet_focus_out(self, source_view, event):
  636.         if not self.snippet:
  637.             return None
  638.         buf = source_view.get_buffer()
  639.         text = buf.get_text(buf.get_start_iter(), buf.get_end_iter())
  640.         self.snippet['text'] = text
  641.         self.snippet_changed()
  642.  
  643.     
  644.     def on_button_new_snippet_clicked(self, button):
  645.         snippet = self.new_snippet()
  646.         if not snippet:
  647.             return None
  648.         parent = self.model.get_iter(self.language_path)
  649.         path = self.model.get_path(parent)
  650.         dummy = self.get_dummy(parent)
  651.         if dummy:
  652.             self.model.remove(dummy)
  653.         
  654.         piter = self.add_snippet(parent, snippet.data)
  655.         self.select_iter(piter)
  656.         if not self.tree_view.row_expanded(path):
  657.             self.tree_view.expand_row(path, False)
  658.             self.select_iter(piter)
  659.         
  660.         self.tree_view.grab_focus()
  661.         path = self.model.get_path(piter)
  662.         self.tree_view.set_cursor(path, self.column, True)
  663.  
  664.     
  665.     def file_filter(self, name, pattern):
  666.         fil = gtk.FileFilter()
  667.         fil.set_name(name)
  668.         for p in pattern:
  669.             fil.add_pattern(p)
  670.         
  671.         return fil
  672.  
  673.     
  674.     def import_snippets(self, filenames):
  675.         success = True
  676.         for filename in filenames:
  677.             if not gedit.utils.uri_has_file_scheme(filename):
  678.                 continue
  679.             
  680.             gfile = gio.File(filename)
  681.             filename = gfile.get_path()
  682.             importer = Importer(filename)
  683.             error = importer.run()
  684.             if error:
  685.                 message = _('The following error occurred while importing: %s') % error
  686.                 success = False
  687.                 message_dialog(self.dlg, gtk.MESSAGE_ERROR, message)
  688.                 continue
  689.         
  690.         self.build_model(True)
  691.         if success:
  692.             message = _('Import successfully completed')
  693.             message_dialog(self.dlg, gtk.MESSAGE_INFO, message)
  694.         
  695.  
  696.     
  697.     def on_import_response(self, dialog, response):
  698.         if response == gtk.RESPONSE_CANCEL or response == gtk.RESPONSE_CLOSE:
  699.             dialog.destroy()
  700.             return None
  701.         f = dialog.get_uris()
  702.         dialog.destroy()
  703.         self.import_snippets(f)
  704.  
  705.     
  706.     def on_button_import_snippets_clicked(self, button):
  707.         dlg = gtk.FileChooserDialog(parent = self.dlg, title = _('Import snippets'), action = gtk.FILE_CHOOSER_ACTION_OPEN, buttons = (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK))
  708.         dlg.add_filter(self.file_filter(_('All supported archives'), ('*.gz', '*.bz2', '*.tar', '*.xml')))
  709.         dlg.add_filter(self.file_filter(_('Gzip compressed archive'), ('*.tar.gz',)))
  710.         dlg.add_filter(self.file_filter(_('Bzip2 compressed archive'), ('*.tar.bz2',)))
  711.         dlg.add_filter(self.file_filter(_('Single snippets file'), ('*.xml',)))
  712.         dlg.add_filter(self.file_filter(_('All files'), '*'))
  713.         dlg.connect('response', self.on_import_response)
  714.         dlg.set_local_only(True)
  715.         dlg.show()
  716.  
  717.     
  718.     def export_snippets_real(self, filename, snippets, show_dialogs = True):
  719.         export = Exporter(filename, snippets)
  720.         error = export.run()
  721.         if error:
  722.             message = _('The following error occurred while exporting: %s') % error
  723.             msgtype = gtk.MESSAGE_ERROR
  724.             retval = False
  725.         else:
  726.             message = _('Export successfully completed')
  727.             msgtype = gtk.MESSAGE_INFO
  728.             retval = True
  729.         if show_dialogs:
  730.             message_dialog(self.dlg, msgtype, message)
  731.         
  732.         return retval
  733.  
  734.     
  735.     def on_export_response(self, dialog, response):
  736.         filename = dialog.get_filename()
  737.         snippets = dialog._export_snippets
  738.         dialog.destroy()
  739.         if response != gtk.RESPONSE_OK:
  740.             return None
  741.         self.export_snippets_real(filename, snippets)
  742.  
  743.     
  744.     def export_snippets(self, filename = None, show_dialogs = True):
  745.         snippets = self.selected_snippets()
  746.         if not snippets or len(snippets) == 0:
  747.             return False
  748.         usersnippets = []
  749.         systemsnippets = []
  750.         for snippet in snippets:
  751.             if snippet.can_modify():
  752.                 usersnippets.append(snippet)
  753.                 continue
  754.             len(snippets) == 0
  755.             systemsnippets.append(snippet)
  756.         
  757.         export_snippets = snippets
  758.         if len(systemsnippets) != 0 and show_dialogs:
  759.             message = _('Do you want to include selected <b>system</b> snippets in your export?')
  760.             mes = gtk.MessageDialog(flags = gtk.DIALOG_MODAL, type = gtk.MESSAGE_QUESTION, buttons = gtk.BUTTONS_YES_NO, message_format = message)
  761.             mes.set_property('use-markup', True)
  762.             resp = mes.run()
  763.             mes.destroy()
  764.             if resp == gtk.RESPONSE_NO:
  765.                 export_snippets = usersnippets
  766.             elif resp != gtk.RESPONSE_YES:
  767.                 return False
  768.         
  769.         if len(export_snippets) == 0 and show_dialogs:
  770.             message = _('There are no snippets selected to be exported')
  771.             message_dialog(self.dlg, gtk.MESSAGE_INFORMATION, message)
  772.             return False
  773.         if not filename:
  774.             dlg = gtk.FileChooserDialog(parent = self.dlg, title = _('Export snippets'), action = gtk.FILE_CHOOSER_ACTION_SAVE, buttons = (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_SAVE, gtk.RESPONSE_OK))
  775.             dlg._export_snippets = export_snippets
  776.             dlg.add_filter(self.file_filter(_('All supported archives'), ('*.gz', '*.bz2', '*.tar')))
  777.             dlg.add_filter(self.file_filter(_('Gzip compressed archive'), ('*.tar.gz',)))
  778.             dlg.add_filter(self.file_filter(_('Bzip2 compressed archive'), ('*.tar.bz2',)))
  779.             dlg.add_filter(self.file_filter(_('All files'), '*'))
  780.             dlg.set_do_overwrite_confirmation(True)
  781.             dlg.set_current_name(self.default_export_name)
  782.             dlg.connect('response', self.on_export_response)
  783.             dlg.set_local_only(True)
  784.             dlg.show()
  785.             return True
  786.         return self.export_snippets_real(filename, export_snippets, show_dialogs)
  787.  
  788.     
  789.     def on_button_export_snippets_clicked(self, button):
  790.         snippets = self.selected_snippets()
  791.         if not snippets or len(snippets) == 0:
  792.             return None
  793.         usersnippets = []
  794.         systemsnippets = []
  795.         for snippet in snippets:
  796.             if snippet.can_modify():
  797.                 usersnippets.append(snippet)
  798.                 continue
  799.             len(snippets) == 0
  800.             systemsnippets.append(snippet)
  801.         
  802.         dlg = gtk.FileChooserDialog(parent = self.dlg, title = _('Export snippets'), action = gtk.FILE_CHOOSER_ACTION_SAVE, buttons = (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_SAVE, gtk.RESPONSE_OK))
  803.         dlg._export_snippets = snippets
  804.         if len(systemsnippets) != 0:
  805.             message = _('Do you want to include selected <b>system</b> snippets in your export?')
  806.             mes = gtk.MessageDialog(flags = gtk.DIALOG_MODAL, type = gtk.MESSAGE_QUESTION, buttons = gtk.BUTTONS_YES_NO, message_format = message)
  807.             mes.set_property('use-markup', True)
  808.             resp = mes.run()
  809.             mes.destroy()
  810.             if resp == gtk.RESPONSE_NO:
  811.                 dlg._export_snippets = usersnippets
  812.             elif resp != gtk.RESPONSE_YES:
  813.                 dlg.destroy()
  814.                 return None
  815.         
  816.         if len(dlg._export_snippets) == 0:
  817.             dlg.destroy()
  818.             message = _('There are no snippets selected to be exported')
  819.             message_dialog(self.dlg, gtk.MESSAGE_INFORMATION, message)
  820.             return None
  821.         dlg.add_filter(self.file_filter(_('All supported archives'), ('*.gz', '*.bz2', '*.tar')))
  822.         dlg.add_filter(self.file_filter(_('Gzip compressed archive'), ('*.tar.gz',)))
  823.         dlg.add_filter(self.file_filter(_('Bzip2 compressed archive'), ('*.tar.bz2',)))
  824.         dlg.add_filter(self.file_filter(_('All files'), '*'))
  825.         dlg.set_do_overwrite_confirmation(True)
  826.         dlg.set_current_name(self.default_export_name)
  827.         dlg.connect('response', self.on_export_response)
  828.         dlg.set_local_only(True)
  829.         dlg.show()
  830.  
  831.     
  832.     def remove_snippet_revert(self, path, piter):
  833.         node = self.snippet_from_iter(self.model, piter)
  834.         Library().revert_snippet(node)
  835.         return piter
  836.  
  837.     
  838.     def remove_snippet_delete(self, path, piter):
  839.         node = self.snippet_from_iter(self.model, piter)
  840.         parent = self.model.iter_parent(piter)
  841.         Library().remove_snippet(node)
  842.         if self.model.remove(piter):
  843.             return piter
  844.         if path[-1] != 0:
  845.             self.select_iter(self.model.get_iter((path[0], path[1] - 1)))
  846.         else:
  847.             dummy = self.add_new_snippet_node(parent)
  848.             self.tree_view.expand_row(self.model.get_path(parent), False)
  849.             return dummy
  850.         return self.model.remove(piter)
  851.  
  852.     
  853.     def on_button_remove_snippet_clicked(self, button):
  854.         (override, remove, system) = self.selected_snippets_state()
  855.         if not (override ^ remove) or system:
  856.             return None
  857.         paths = self.selected_snippets(include_languages = False, as_path = True)
  858.         if override:
  859.             action = self.remove_snippet_revert
  860.         else:
  861.             action = self.remove_snippet_delete
  862.         self.tree_view.get_selection().unselect_all()
  863.         references = []
  864.         for path in paths:
  865.             references.append(gtk.TreeRowReference(self.model, path))
  866.         
  867.         select = None
  868.         for reference in references:
  869.             path = reference.get_path()
  870.             piter = self.model.get_iter(path)
  871.             res = action(path, piter)
  872.             if res:
  873.                 select = res
  874.                 continue
  875.         
  876.         if select:
  877.             self.select_iter(select)
  878.         
  879.         self.selection_changed()
  880.  
  881.     
  882.     def set_accelerator(self, keyval, mod):
  883.         accelerator = gtk.accelerator_name(keyval, mod)
  884.         self.snippet['accelerator'] = accelerator
  885.         return True
  886.  
  887.     
  888.     def on_entry_accelerator_key_press(self, entry, event):
  889.         source_view = self['source_view_snippet']
  890.         if event.keyval == gdk.keyval_from_name('Escape'):
  891.             entry.set_text(self.snippet.accelerator_display())
  892.             self.tree_view.grab_focus()
  893.             return True
  894.         if event.keyval == gdk.keyval_from_name('Delete') or event.keyval == gdk.keyval_from_name('BackSpace'):
  895.             entry.set_text('')
  896.             self.snippet['accelerator'] = ''
  897.             self.tree_view.grab_focus()
  898.             self.snippet_changed()
  899.             return True
  900.         if Library().valid_accelerator(event.keyval, event.state):
  901.             self.set_accelerator(event.keyval, event.state & gtk.accelerator_get_default_mod_mask())
  902.             entry.set_text(self.snippet.accelerator_display())
  903.             self.snippet_changed()
  904.             self.tree_view.grab_focus()
  905.         else:
  906.             return True
  907.         return event.keyval == gdk.keyval_from_name('BackSpace')
  908.  
  909.     
  910.     def on_entry_accelerator_focus_in(self, entry, event):
  911.         if self.snippet['accelerator']:
  912.             entry.set_text(_('Type a new shortcut, or press Backspace to clear'))
  913.         else:
  914.             entry.set_text(_('Type a new shortcut'))
  915.  
  916.     
  917.     def update_language_path(self):
  918.         (model, paths) = self.tree_view.get_selection().get_selected_rows()
  919.         current_parent = None
  920.         for path in paths:
  921.             piter = model.get_iter(path)
  922.             parent = model.iter_parent(piter)
  923.             if parent:
  924.                 path = model.get_path(parent)
  925.             
  926.             if current_parent != None and current_parent != path:
  927.                 current_parent = None
  928.                 break
  929.                 continue
  930.             current_parent = path
  931.         
  932.         self.language_path = current_parent
  933.  
  934.     
  935.     def on_tree_view_selection_changed(self, selection):
  936.         (parent, piter, node) = self.selected_snippet()
  937.         if self.snippet:
  938.             self.on_entry_tab_trigger_focus_out(self['entry_tab_trigger'], None)
  939.             self.on_source_view_snippet_focus_out(self['source_view_snippet'], None)
  940.             self.on_entry_drop_targets_focus_out(self['combo_drop_targets'].child, None)
  941.         
  942.         self.update_language_path()
  943.         if node:
  944.             self.snippet = Snippet(node)
  945.         else:
  946.             self.snippet = None
  947.         self.selection_changed()
  948.  
  949.     
  950.     def iter_after(self, target, after):
  951.         if not after:
  952.             return True
  953.         tp = self.model.get_path(target)
  954.         ap = self.model.get_path(after)
  955.         if tp[0] > ap[0] or tp[0] == ap[0]:
  956.             if len(ap) == 1 or tp[1] > ap[1]:
  957.                 return True
  958.             return False
  959.  
  960.     
  961.     def on_tree_view_snippets_key_press(self, treeview, event):
  962.         if event.keyval == gdk.keyval_from_name('Delete'):
  963.             self.on_button_remove_snippet_clicked(None)
  964.             return True
  965.  
  966.     
  967.     def on_tree_view_snippets_row_expanded(self, treeview, piter, path):
  968.         self.fill_if_needed(piter)
  969.         self.select_iter(piter)
  970.  
  971.     
  972.     def on_entry_drop_targets_drag_data_received(self, entry, context, x, y, selection_data, info, timestamp):
  973.         if not gtk.targets_include_uri(context.targets):
  974.             return None
  975.         uris = drop_get_uris(selection_data)
  976.         if not uris:
  977.             return None
  978.         for uri in uris:
  979.             
  980.             try:
  981.                 mime = gio.content_type_guess(uri)
  982.             except:
  983.                 None if entry.get_text() else gtk.targets_include_uri(context.targets)
  984.                 mime = None
  985.  
  986.             if mime:
  987.                 mimes.append(mime)
  988.                 continue
  989.             None if entry.get_text() else gtk.targets_include_uri(context.targets)
  990.         
  991.         entry.set_text(', '.join(mimes))
  992.         self.on_entry_drop_targets_focus_out(entry, None)
  993.         context.finish(True, False, timestamp)
  994.         entry.stop_emission('drag_data_received')
  995.  
  996.  
  997.